﻿using Microsoft.AspNetCore.Components.Forms;
using Microsoft.AspNetCore.Mvc.ModelBinding;
using Qiniu.Http;
using Qiniu.IO.Model;
using Qiniu.IO;
using Qiniu.Util;
using System.ComponentModel.DataAnnotations;
using System.Net;
using System.Reflection;
using System.Text;

namespace Carlife.APi
{
    public class FileHelpers
    {
        public static async Task<string> ProcessFormFile(IBrowserFile formFile,/* ModelStateDictionary modelState, IWebHostEnvironment envir, */long maxFileSize)
        {
            var fieldDisplayName = string.Empty;

            if (!string.IsNullOrEmpty(formFile.Name))
            {
                // 如果名称没有找到，将会有一个简单的错误消息，但不会显示文件名称
                string displayFileName = formFile.Name.Substring(formFile.Name.IndexOf(".") + 1);

                fieldDisplayName = $"{displayFileName} ";
                //这里的ak sk 可以写到配置文件中方便修改
                Mac mac = new Mac("6x1LaFjKxvnM6r7E8J82V_yLfStDPl1GWnih8IMT", "AFPCBoqIWULlohZan-NWDI1eMSqhVmEuA-WuJpcI");
                // 上传策略，参见 
                // https://developer.qiniu.com/kodo/manual/put-policy
                PutPolicy putPolicy = new PutPolicy();
                // 如果需要设置为"覆盖"上传(如果云端已有同名文件则覆盖)，请使用 SCOPE = "BUCKET:KEY"
                // putPolicy.Scope = bucket + ":" + saveKey;  
                //上传储存的空间名称
                putPolicy.Scope = "guduyun";
                // 上传策略有效期(对应于生成的凭证的有效期)          
                putPolicy.SetExpires(3600);
                // 上传到云端多少天后自动删除该文件，如果不设置（即保持默认默认）则不删除
                // putPolicy.DeleteAfterDays = 1;
                string jstr = putPolicy.ToJsonString();
                //获取上传凭证
                var uploadToken = Auth.CreateUploadToken(mac, jstr);

                //false 使用https 自动识别存储空间            
                Qiniu.Common.Config.AutoZone("6x1LaFjKxvnM6r7E8J82V_yLfStDPl1GWnih8IMT", "guduyun", false);

                UploadManager um = new UploadManager();
                //foreach (IFormFile file in files)//获取多个文件列表集合
                //{
                //    if (file.Length > 0)
                //    {
                Stream stream = formFile.OpenReadStream();
                //var fileName = ContentDispositionHeaderValue
                //.Parse(file.ContentDisposition)
                //.FileName
                //.Trim('"');
                string fileName = formFile.Name.Substring(formFile.Name.LastIndexOf('.')); //文件扩展名
                                                                                             //DateTime.Now.ToString("yyyyMMddHHmmssffffff")
                var saveKey = "finan/" + Guid.NewGuid().ToString("N") + fileName;//重命名文件加上时间戳 其中上传地址也可以配置s   
                HttpResult result = await um.UploadStreamAsync(stream, saveKey, uploadToken);

                if (result.Code == 200)
                {
                    return result.Text;
                }
                else
                {
                    throw new Exception(result.RefText);//上传失败错误信息
                }
            }

            //使用path.GetFileName获取一个带路径的全文件名。
            //通过HtmlEncode进行编码的结果必须在错误消息中返回。
           


            //校验文件长度，如果文件不包含内容，则不必读取文件长度。
            //此校验不会检查仅具有BOM（字节顺序标记）作为内容的文件，
            //因此在读取文件内容后再次检验文件内容长度，以校验仅包含BOM的文件。
            //if (formFile.Size == 0)
            //{
            //    modelState.AddModelError(formFile.Name, $"The {fieldDisplayName}file ({fileName}) is empty.");

            //}
            //else if (formFile.Size > maxFileSize)
            //{

            //    modelState.AddModelError(formFile.Name, $"The {fieldDisplayName}file ({fileName}) exceeds 1 MB.");
            //}
            else
            {
                try
                {


                    //获取一个随机文件名
                    var trustedFileNameForFileStorage = Path.GetRandomFileName();
                    //var path = Path.Combine(envir.ContentRootPath, envir.EnvironmentName, "unsafeUploads", trustedFileNameForFileStorage);

                    //using (
                    //    var reader =
                    //        new FileStream(
                    //            path,
                    //            FileMode.Create))
                    //{
                    //    await formFile.OpenReadStream(maxFileSize).CopyToAsync(reader);
                    //}

                }
                catch (Exception ex)
                {
                    //modelState.AddModelError(formFile.Name,

                    //                         $"The {fieldDisplayName}file ({fileName}) upload failed. " +

                    //                         $"Please contact the Help Desk for support. Error: {ex.Message}");
                    //return ex.Message;
                    throw ex;
                }
            }
            return string.Empty;
        }





    }
}
